class Solution {
public:
    int romanToInt(string str) {
        // 以下时某题解的解法
        int num = 0;
        char* s = (char*)str.c_str();
        while (*s != '\0') {
            if (*s == 'M' || *s == 'D')
                num += (*s == 'M') ? 1000 : 500;
            if (*s == 'L' || *s == 'V')
                num += (*s == 'L') ? 50 : 5;                                // 以这四个罗马数字开头的（即不包括I，X，C），一定是普通情况
            if (*s == 'C')
                num += (*(s + 1) == 'D' || *(s + 1) == 'M') ? -100 : 100;   // 如果是CD或CM则减去C，否则加上C
            if (*s == 'X')
                num += (*(s + 1) == 'L' || *(s + 1) == 'C') ? -10 : 10;     // 如果是XL或XC则减去X，否则加上X
            if (*s == 'I')
                num += (*(s + 1) == 'V' || *(s + 1) == 'X') ? -1 : 1;       // 如果是IV或IX则减去I，否则加上I
            s++;
        }
        return num;

        // 以下是我自己的解法
        // vector<int> graph(26);
        // int n = str.size();
        // graph['I' - 65] = 1, graph['V' - 65] = 5, graph['X' - 65] = 10,
        // graph['L' - 65] = 50, graph['C' - 65] = 100, graph['D' - 65] = 500,
        // graph['M' - 65] = 1000; int ret = 0; for(int i = 0; i < n; i++)
        // {
        //     if((str[i] == 'I' && i + 1 < n && (str[i + 1] == 'V' || str[i +
        //     1] == 'X'))
        //     || (str[i] == 'X' && i + 1 < n && (str[i + 1] == 'L' || str[i +
        //     1] == 'C'))
        //     || (str[i] == 'C' && i + 1 < n && (str[i + 1] == 'D' || str[i +
        //     1] == 'M')))
        //         ret += graph[str[i + 1] - 65] - graph[str[i++] - 65];
        //     else
        //         ret += graph[str[i] - 65];
        // }
        // return ret;
    }
};